Inside Macintosh: Files

Previous | Chapter Top | Chapter Contents | Next

Creating a New File

The user expects to be able to create a new document using the New command in the File menu. Listing 1-4 illustrates one way to handle the New menu command.

Listing 4 Handling the New menu command

FUNCTION DoNewCmd: OSErr;
VAR
    myWindow:       WindowPtr;      {the new document window; ignored here}
BEGIN
    {Create a new window and make it visible.}
    DoNewCmd := DoNewDocWindow(TRUE, myWindow);
END;

The DoNewCmd function simply calls the application-defined function DoNewDocWindow (shown in Listing 1-6 ). The first parameter to DoNewDocWindow determines whether the new window should be visible or not; the value TRUE indicates that the new window should be visible. If DoNewDocWindow completes successfully, it returns a window pointer to the calling routine in the second parameter. The DoNewCmd function ignores that returned window pointer.

Listing 5 Creating a new document window

FUNCTION DoNewDocWindow (newDocument: Boolean; var myWindow: WindowPtr):
                                             OSErr;
VAR
    myData:         MyDocRecHnd;        {the window's data record}
CONST
    rDocWindow = 1000;                  {resource ID of window template}
BEGIN
    {Allocate a new window; see Window Mgr chapter for details.}
    myWindow := GetNewWindow(rDocWindow, NIL, WindowPtr(-1));
    IF myWindow = NIL THEN
        BEGIN
            DoNewDocWindow := MemError;
            Exit(DoNewDocWindow);
        END;

    {Allocate space for the window's data record.}
    myData := MyDocRecHnd(NewHandle(SizeOf(MyDocRec)));
    IF myData = NIL THEN
        BEGIN
            DoNewDocWindow := MemError;
            DisposeWindow(myWindow);
            Exit(DoNewDocWindow);
        END;
        
    MoveHHi(Handle(myData));                            {move the handle high}
    HLock(Handle(myData));                              {lock the handle}
    WITH myData^^ DO                                    {fill in window data}
        BEGIN
            editRec := TENew(gDestRect, gViewRect);
            vScroll := GetNewControl(rVScroll, myWindow);
            hScroll := GetNewControl(rHScroll, myWindow);
            fileRefNum := 0;                            {no file yet!}
            windowDirty := FALSE;
            IF (editRec = NIL) OR (vScroll = NIL) OR (hScroll = NIL) THEN
                BEGIN
                    DoNewDocWindow := memFullErr;
                    DisposeWindow(myWindow);
                    DisposeControl(vScroll);
                    DisposeControl(hScroll);
                    TEDispose(editRec);
                    DisposeHandle(myData);
                    Exit(DoNewDocWindow);
                END;
        END;

    IF newDocument THEN                                 {if new document, show it}
        ShowWindow(myWindow);

    SetWRefCon(myWindow, LongInt(myData));              {link record to window}
    HUnlock(Handle(myData));                            {unlock the handle}
    DoNewDocWindow := noErr;
END;

Note that the DoNewDocWindow function does not actually create a new file. The reason for this is that it is usually better to wait until the user actually saves a new document before creating a file (mainly because the user might decide not to save the document). The DoNewDocWindow function creates a window, allocates a new document record, and fills out the fields of that record. However, it sets the fileRefNum field of the document record to 0 to indicate that no file is currently associated with this window.


© 1997 Apple Computer, Inc.

Previous | Chapter Top | Chapter Contents | Next